#include <iostream>
using namespace std;

const int N = 110;

bool a[N][N]; //获取输入
int n;
int k; //获取结果

void out() //输出整个矩阵，debug专用
{
    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j <= n; ++j)
            cout << a[i][j];
        puts("");
    }
    puts("");
    return;
}
int xorgauss() //异或高斯消元
{
    int c = 0, r = 0;              //c代表当前指向的列，r代表当前指向的行
    int t = 0;                     //t指示的是当前列某一个系数为一的行
    for (c = 0, r = 0; c < n; ++c) //遍历每一个系数列
    {
        //第一步，找到对应系数为1的那一行
        t = r; //先默认当前指向的行本来就不是0
        for (int i = r; i < n; ++i)
            if (a[i][c])
            {
                t = i;
                break;
            }
        if (!a[t][c])
            continue; //如果找了一圈都是a[t][c]为0，那么就代表这一列没有1，那么没必要消元，直接下一列
        //能到这里，代表找到了，至此，第一步结束
        //第二步，把找到的换上去
        if (t != r)                      //相等就不用换了
            for (int i = c; i <= n; ++i) //从当前列开始换，因为前面的已经全部为0了
                swap(a[t][i], a[r][i]);
        //至此，第二步结束
        //第三步，把下面的全部消为0（既是1就异或，是0就不管）
        for (int i = r + 1; i < n; ++i) //遍历下面的全部行
            if (a[i][c])                //如果是1
                for (int j = c; j <= n; ++j)
                    a[i][j] ^= a[r][j];
        //至此，第三步结束
        ++r; //处理完三步就前往下一行
    }
    // out();
    if (r == n) //每一行都能完整走完，一定有解，反向带回去消元
    {
        for (int i = n - 1; i > 0; --i)      //以第i行第i列的元素作为标准向上进行消元
            for (int j = i - 1; j >= 0; --j) //j记录我们现在消元到了第几行
                if (a[j][i])                 //当前要消去的元不为0
                {
                    a[j][i] ^= a[i][i];
                    a[j][n] ^= a[i][n];
                }
        // out();
        return 1;
    }
    else
    {
        for (int i = r; i < n; ++i)
            if (a[i][n])
                return 0;
        return 2;
    }
}

int main()
{
    // freopen("cin.txt", "r", stdin);
    cin >> n;
    for (int i = 0; i < n; ++i)
        for (int j = 0; j <= n; ++j)
            cin >> a[i][j]; //输入
    k = xorgauss();         //消元
    //处理结果并且输出
    if (k == 0)
        puts("No solution");
    else if (k == 1)
        for (int i = 0; i < n; ++i)
            cout << a[i][n] << endl;
    else if (k == 2)
        puts("Multiple sets of solutions");
    return 0;
}